/**
**********************************************************************************************************************************************************************************************************************************
* @file:	cjsonutils.h
* @author:	zinface
* @date:	2021年09月20日 19:04:48 星期一
* @brief:	为操作 cJson 提供的API映射
* 
* cJson: Json 对象指针(ptr)
* 
* 1. createJsonObject(): 创建空Json对象
* 2. createJsonArray(): 创建空Json数组
* 
* 3. createJsonNull(): 创建基于 Json 对象的值
* 3. createJsonTrue(): 创建基于 Json 对象的值
* 3. createJsonFalse(): 创建基于 Json 对象的值
* 3. createJsonBool(): 创建基于 Json 对象的值
* 3. createJsonNumber(): 创建基于 Json 对象的值
* 3. createJsonString(): 创建基于 Json 对象的值
* 
* addNullToObject
* addTrueToObject
* addFalseToObject
* addBoolToObject
* addNumberToObject
* addStringToObject
* addRawToObject
* addObjectToObject
* addArrayToObject
* 
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef CJSONUTILS_H
# define CJSONUTILS_H

#include "cJSON.h"

typedef void(*cJson);
#define cJson cJSON*

// Json Container
typedef void(*createJsonObject);
typedef void(*createJsonArray);
#define createJsonObject cJSON_CreateObject // cJSON_CreateObject()
#define createJsonArray cJSON_CreateArray   // cJSON_CreateArray()

// Json Item
typedef void(*createJsonNull);
typedef void(*createJsonTrue);
typedef void(*createJsonFalse);
typedef void(*createJsonBool);
typedef void(*createJsonNumber);
typedef void(*createJsonString);
#define createJsonNull          cJSON_CreateNull            // cJSON_CreateNull(void);
#define createJsonTrue          cJSON_CreateTrue            // cJSON_CreateTrue(void);
#define createJsonFalse         cJSON_CreateFalse           // cJSON_CreateFalse(void);
#define createJsonBool          cJSON_CreateBool            // cJSON_CreateBool(cJSON_bool boolean);
#define createJsonNumber        cJSON_CreateNumber          // cJSON_CreateNumber(double num);
#define createJsonString        cJSON_CreateString          // cJSON_CreateString(const char *string);

// Add to Object
typedef void(*addNullToObject);
typedef void(*addTrueToObject);
typedef void(*addFalseToObject);
typedef void(*addBoolToObject);
typedef void(*addNumberToObject);
typedef void(*addStringToObject);
typedef void(*addRawToObject);
typedef void(*addObjectToObject);
typedef void(*addArrayToObject);
#define addNullToObject     cJSON_AddNullToObject       // (cJSON * const object, const char * const name);
#define addTrueToObject     cJSON_AddTrueToObject       // (cJSON * const object, const char * const name);
#define addFalseToObject    cJSON_AddFalseToObject      // (cJSON * const object, const char * const name);
#define addBoolToObject     cJSON_AddBoolToObject       // (cJSON * const object, const char * const name, const cJSON_bool boolean);
#define addNumberToObject   cJSON_AddNumberToObject     // (cJSON * const object, const char * const name, const double number);
#define addStringToObject   cJSON_AddStringToObject     // (cJSON * const object, const char * const name, const char * const string);
#define addRawToObject      cJSON_AddRawToObject        // (cJSON * const object, const char * const name, const char * const raw);
#define addObjectToObject   cJSON_AddObjectToObject     // (cJSON * const object, const char * const name);
#define addArrayToObject    cJSON_AddArrayToObject      // (cJSON * const object, const char * const name);

// Add to Array
typedef void(*addItemToArray);
#define addItemToArray      cJSON_AddItemToArray        // cJSON_AddItemToArray(cJSON *array, cJSON *item)

typedef void(*addNullToArray);
typedef void(*addTrueToArray);
typedef void(*addFalseToArray);
typedef void(*addBoolToArray);
typedef void(*addNumberToArray);
typedef void(*addStringToArray);

#define addNullToArray(c)       cJSON_AddItemToArray(c,createJsonNull())
#define addTrueToArray(c)       cJSON_AddItemToArray(c,createJsonTrue())
#define addFalseToArray(c)      cJSON_AddItemToArray(c,createJsonFalse())
#define addBoolToArray(c,v)     cJSON_AddItemToArray(c,createJsonBool(v))
#define addNumberToArray(c,v)   cJSON_AddItemToArray(c,createJsonNumber(v))
#define addStringToArray(c,v)   cJSON_AddItemToArray(c,createJsonString(v))


// 转换
typedef void(*toJsonObject);
typedef char*(*toStringJson);
typedef char*(*toStringUnformatJson);
#define toJsonObject(s)                 cJSON_Parse(s)          // cJSON_Parse(const char *value)
#define toStringJson                    cJSON_Print             // cJSON_Print(const cJSON *item)
#define toStringUnformatJson            cJSON_PrintUnformatted  // cJSON_PrintUnformatted(const cJSON *item)


typedef void(*deleteJsonObject);
typedef void(*getArrayItem);
typedef void(*getObjectItem);
#define deleteJsonObject(v)         cJSON_Delete(v)             // cJSON_Delete(cJSON *item)
#define getArrayItem(c, i)          cJSON_GetArrayItem(c, i)    // cJSON_GetArrayItem(const cJSON *array, int index)
#define getObjectItem(c, k)         cJSON_GetObjectItem(c, k)   // cJSON_GetObjectItem(const cJSON * const object, const char * const string)

typedef void(*getArraySize);
#define getArraySize(c)         cJSON_GetArraySize(c)       // cJSON_GetArraySize(const cJSON *array)

typedef void(*freeObject);
#define freeObject(c) cJSON_free(c)                         // cJSON_free(void *object)
#endif